/**
 * @brief 策略模式。依赖libcstl, 虽然是一天比较老的项目也停止维护了，但是项目的质量还是不错。
 * @version 1.0
 * @author 宋炜
 */

#ifndef __STRATEGY_H__
#define __STRATEGY_G__

#include <cstl/cmap.h>
/**
 * 提供给map的key比较函数，满足条件返回true，否则返回false。需要注意的是在默认情况下
 * map使用的是红黑树保存数据，所以比较会存在比较大小的情况，要求比较函数提供小于等于返
 * 回true的方式。key值类型使用void*存储，实际需要根据具体的情况处理实际的数据类型。
 */
typedef bool (*strategyKeyCmpFunc)( void * a , void * b );
/**
 * key释放操作函数指针，方便针对一些比较复杂的key值
 */
typedef void (*strategyKeyFree)( void *);
/**
 * 根据key要执行的任务的方法的类型
 */
typedef void* (*strategyCallFunc)( void * usr , void * );

typedef struct stStrategy
{
	// 
	strategyKeyCmpFunc  cmp_func;
	strategyKeyFree     key_free_func;
	/// 用户预留信息，比如可以配置会回调回去的对象指针
	void              * p_user,
	map_t             * p_map;
} strategy_t;

/// 定义用来在map的回调函数中找到实际的策略对象
struct stKeyWrap
{
	// 键
	void       * p_key;
	// 策略对象，连同键一同注册到map中去
	strategy_t * p_obj;
};
/**
 * @brief 创建策略对象
 */
strategy_t * newStrategy( strategyKeyCmpFunc cmp , strategyKeyFree funcfree , void * user );
/**
 */
void releaseStrategy( strategy_t * ctx );
/**
 * @brief 添加策略内容
 */
bool strategyAdd( strategy_t * ctx , void * key , void * func );
/**
 * @brief 删除策略内容
 */
bool strategyErase( strategy_t * ctx , void * key );

/**
 * @brief 执行策略
 */
void * strategyCall( strategy_t * ctx , void * key , void * params );

#endif
